//
//  UIImage+MultiFormat123.m
//  RBIOSBase
//
//  Created by ren on 21/11/2017.
//  Copyright © 2017 bryan. All rights reserved.
//

#import "UIImage+MultiFormat123.h"

@implementation UIImage (MultiFormat123)

+ (UIImage *)br_imageWithData:(NSData *)data
{
	if (!data) {
		return nil;
	}
	
	UIImage *image;
	image = [[UIImage alloc] initWithData:data];
	UIImageOrientation orientation = [self br_imageOrientationFromImageData:data];
	if (orientation != UIImageOrientationUp) {
		image = [UIImage imageWithCGImage:image.CGImage scale:image.scale orientation:orientation];
	}
	return image;
}

+ (UIImageOrientation)br_imageOrientationFromImageData:(NSData *)imageData
{
	UIImageOrientation result = UIImageOrientationUp;
	CGImageSourceRef imageSource = CGImageSourceCreateWithData((__bridge CFDataRef)imageData, NULL);
	if (imageSource) {
		CFDictionaryRef properties = CGImageSourceCopyPropertiesAtIndex(imageSource, 0, NULL);
		if (properties) {
			CFTypeRef val;
			int exifOrientation;
			val = CFDictionaryGetValue(properties, kCGImagePropertyOrientation);
			if (val) {
				CFNumberGetValue(val, kCFNumberIntType, &exifOrientation);
				result = [self sd_exifOrientationToiOSOrientation:exifOrientation];
			} // else - if it's not set it remains at up
			CFRelease((CFTypeRef) properties);
		} else {
			//NSLog(@"NO PROPERTIES, FAIL");
		}
		CFRelease(imageSource);
	}
	return result;
}

+ (UIImageOrientation) sd_exifOrientationToiOSOrientation:(int)exifOrientation {
	UIImageOrientation orientation = UIImageOrientationUp;
	switch (exifOrientation) {
		case 1:
			orientation = UIImageOrientationUp;
			break;
			
		case 3:
			orientation = UIImageOrientationDown;
			break;
			
		case 8:
			orientation = UIImageOrientationLeft;
			break;
			
		case 6:
			orientation = UIImageOrientationRight;
			break;
			
		case 2:
			orientation = UIImageOrientationUpMirrored;
			break;
			
		case 4:
			orientation = UIImageOrientationDownMirrored;
			break;
			
		case 5:
			orientation = UIImageOrientationLeftMirrored;
			break;
			
		case 7:
			orientation = UIImageOrientationRightMirrored;
			break;
		default:
			break;
	}
	return orientation;
}

@end
